package forRecherche;

import java.util.ArrayList;
import java.util.TreeSet;

import label.SynonymGetter;

/**
 * Pour une recherche, génère un ensemble de sous recherche associees
 * @author louis
 *
 */
public class SousRechercheCreator {
	private ArrayList<MotRequete> requeteInitiale;
	
	public SousRechercheCreator(String saisieUtilisateur){
		this.setRequeteInitiale(new ArrayList<MotRequete>());
		
		String[] parties = saisieUtilisateur.split("[^a-zA-Z0-9éèàçù/]");

		for(String s : parties){
			s=s.toLowerCase();
			//par défaut la ponderation de chaque mot est de 1
			if(!s.equalsIgnoreCase(" ") && !s.equalsIgnoreCase("")){
				this.requeteInitiale.add(new MotRequete(s, 1));
			}
		}
	}
	/**
	 * Pour un mot, retourne les mots ponderes associes sous forme de liste
	 * @param mot Le mot a trouver les mots lies
	 * @return Une liste de requetes comprenant les mots lies (grace au web semantique)
	 */
	private ArrayList<MotRequete> createSurchargeForOneMot(String mot){
		//On prend les mots associes
		SynonymGetter g = new SynonymGetter(mot);
		g.getSynonym();//g contient tous les synonymes du mot
		
		ArrayList<String> synonym = g.getListeLabel();
		ArrayList<String> instances=g.getListInstance();
		ArrayList<String> sousClasse = g.getListSousClass();
		
		ArrayList<MotRequete> resultat = new ArrayList<MotRequete>();
		
		//parcourt la liste des synonymes : on ne change pas la ponderation
		for(String s : synonym){
			resultat.add(new MotRequete(s, 1));
		}
		
		//parcourt les sous classes : on divise la ponderation de chaque sous classe par le nombre total de sous classe
		for(String s : sousClasse){
			resultat.add(new MotRequete(s,(float) 1/sousClasse.size()));
		}
		
		//de même pour les individus
		for(String s : instances){
			resultat.add(new MotRequete(s,(float) 1/instances.size()));
		}
		return resultat;
	}

	/**
	 * Pour la requete, retourne les mots ponderes associes sous forme de liste
	 * @return Les mots ponderes associes sous forme de liste
	 */
	public ArrayList<MotRequete> createSurcharge(){
		TreeSet<MotRequete> resultat = new TreeSet<MotRequete>();
		for(MotRequete s : this.requeteInitiale){
			resultat.add(s);
			resultat.addAll(this.createSurchargeForOneMot(s.getMot()));
		}
		return new ArrayList<MotRequete>(resultat);
	}
	
	public ArrayList<MotRequete> getRequeteInitiale() {
		return requeteInitiale;
	}

	public void setRequeteInitiale(ArrayList<MotRequete> requeteInitiale) {
		this.requeteInitiale = requeteInitiale;
	}
	
}
